package cn.xeblog.plugin.ui;

import cn.hutool.core.collection.CollUtil;
import cn.xeblog.commons.util.ClassUtils;
import cn.xeblog.plugin.enums.Command;
import cn.xeblog.plugin.listener.MainWindowInitializedEventListener;
import com.intellij.util.PathUtil;
import java.util.Set;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextPane;

/**
 * 主窗口
 * @author anlingyi
 * @date 2020/5/26
 */
public class MainWindow {

  /**
   * 主面板
   */
  private JPanel mainPanel;

  // ------------------- 面板左边 ------------------
  /**
   * 左边面板
   */
  private JPanel leftPanel;

  // ------------------- 消息区域 ------------------
  /**
   * 消息面板滚动条
   */
  private JScrollPane consoleScroll;

  /**
   * 消息面板（消息区域）
   */
  private JTextPane console;

  // ------------------- 发送消息框 ------------------

  /**
   * 内容区域(输入区域)
   */
  private JTextArea contentArea;

  /**
   * 左边顶部面板（用来显示命令列表和@用户列表的）
   */
  private JPanel leftTopPanel;

  // ------------------- 面板左边 ------------------
  /**
   * 右边面板
   */
  private JPanel rightPanel;

  /**
   * 主窗口对象
   */
  private static final MainWindow MAIN_WINDOW;

  static {
    // 初始化窗口
    MAIN_WINDOW = new MainWindow();
    MAIN_WINDOW.afterInit();
  }

  private MainWindow() {

  }

  private void afterInit() {
    // 获取指定class所在的jar包路径
    String path = PathUtil.getJarPathForClass(MainWindow.class);
    // 在jar包路径下扫描出MainWindowInitializedEventListener.class的子类
    Set<Class<?>> initClasses = ClassUtils.scanSubClass(path, null, MainWindowInitializedEventListener.class);

    if (CollUtil.isNotEmpty(initClasses)) {
      try {
        for (Class<?> initClass : initClasses) {
          // 调用无参的构造方法实例化对象
          MainWindowInitializedEventListener obj = (MainWindowInitializedEventListener) initClass.getDeclaredConstructor()
              .newInstance();
          // 对象初始化
          obj.afterInit(this);
        }
      } catch (Exception e) {
        e.printStackTrace();
      }
    }

    Command.HELP.exec();
  }

  /**
   * 获取当前实例
   *
   * @return 主窗口
   */
  public static MainWindow getInstance() {
    return MAIN_WINDOW;
  }

  public JPanel getMainPanel() {
    return mainPanel;
  }

  public JPanel getRightPanel() {
    return rightPanel;
  }

  public JTextArea getContentArea() {
    return contentArea;
  }

  public JPanel getLeftTopPanel() {
    return leftTopPanel;
  }

  public JTextPane getConsoleTextPane() {
    return console;
  }

  public JPanel getLeftPanel() {
    return leftPanel;
  }

  public JScrollPane getConsoleScrollPane() {
    return consoleScroll;
  }

}
